10104
2168
Dette spørsmålet har allerede svar her:
Ingen implisitt konvertering i overbelastet operatør
(2 svar)
Stengt for 7 år siden.
Jeg skriver en enkel innpakning for en elementær type, og prøver å unngå å måtte skrive for mange smaker av standardoperatører. Jeg håpet implisitt type konvertering ville hjelpe, men det gjør det ikke. Her er et strippet eksempel:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Int operator + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(ugyldig) (Int (1) + 2); // Fint
(ugyldig) (2 + Int (1)); // feil: ugyldige operander til binært uttrykk ('int' og 'Int')
}
Jeg bruker llvm. Den første linjen med hovedkompilering er bra. Den andre forårsaker en feil. Nå, det jeg håpet ville skje i andre linje er at 2 implisitt ble konvertert til Int (2), etterfulgt av en samtale til operatør +. Hvorfor skjer ikke det? Hvorfor skjer den implisitte konverteringen i første linje? 
Det skjer i første linje fordi den eneste operatøren + tilgjengelig er operator + (Int &) (som har en implisitt første parameter på Int for denne forekomsten). Den andre linjen mislykkes fordi den første parameteren er en int og den ikke har noen anelse om at den trenger å konvertere den før du prøver operasjonen (den vet ikke at den trenger å bruke Int :: operator +).
Du kan unngå dette problemet ved å gjøre operatøren til en vennefunksjon som ikke er medlem (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
venn Int-operatør + (const Int & lhs, const Int & rhs);
};
Int operator + (const Int & lhs, const Int & rhs)
{
returnere lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
retur 0;
}
|
Er ikke svaret du leter etter? Bla gjennom andre spørsmål merket c ++ operatør-nøkkelord implisitt-konvertering eller still ditt eget spørsmål.